package model;

import java.util.ArrayList;
import java.util.List;

import observer.NotificationActionPropositionManager;
import observer.ObserverPropositionManager;

import model.exception.OffreNonValideException;
import model.states.EtatOffreRefusee;
import model.states.EtatOffreValidee;
import model.states.EtatPropositionEnAttente;

public class Conseiller extends Personnel implements PropositionManager{

	public Conseiller(){
		super() ;
		
	}
	
	public Conseiller(String n, String p, String num, String typeV, String nomV, String code, String v,String pa, String ma, int an, int m, int jo, String mdp,String id, String idAgence) {
		
		super(n, p, num, typeV, nomV, code, v,pa, ma, an, m, jo, mdp,id,idAgence) ;
		addObserver(new ObserverPropositionManager());
	}
	
	/**
	 * Validation d'une Offre
	 * @param o l'Offre a valider
	 */
	public void validerOffre(Offre o){
		o.setEtatOffre(new EtatOffreValidee());
	}
	/**
	 * Refus d'une Offre
	 * @param o l'Offre a refuser
	 */
	public void refuserOffre(Offre o){
		o.setEtatOffre(new EtatOffreRefusee());
	}
	/**
	 * @return List<Demandeur> la liste des Demandeurs compatibles	 
	 * @param o l'Offre 
	 */
	public List<Demandeur> rechercherDemandeur(Offre o){
		List<Demandeur> listeDemandeurCompatibles = new ArrayList<Demandeur>();
		for(Demandeur d : AgenceManager.getInstance().getListeDemandeur(identifiantAgence)){
			if(d.isEnAdequation(o)) listeDemandeurCompatibles.add(d);
		}
		return listeDemandeurCompatibles;
	}
	
	/**
	 * @return Proposition la proposition en attente cree
	 * @param d the Demandeur a qui proposer l'offre
	 * @param o the Offre qui est proposee
	 * @throws OffreNonValideException 
	 */
	
	public Proposition creerProposition(Demandeur d,Offre o) throws OffreNonValideException{
		if(o.isValide()){
			Proposition proposition = new Proposition(d,o);
			proposition.setEtatProposition(new EtatPropositionEnAttente());
			notificationPropositionManager(proposition, "Creation");
			return proposition;
		}
		throw new OffreNonValideException(o.getIdentifiant());
		
	}

	public void notificationPropositionManager(Proposition p, String typeModif) {
		setChanged();
		notifyObservers(new NotificationActionPropositionManager(this, typeModif, p));
		clearChanged();		
	}

	
	

	
	
}
